package com.client.job.runJob;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;


/**
 * 操作线程池中的任务得到增删改查
 *
 * @author mengxiangzhong
 * @des
 * @date 2021年9月2日
 */


@Component
public class JobScheduleCurd {

    private Map<String, ScheduledFuture<?>> futuresMap = new ConcurrentHashMap<>();

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    /**
     * 获取到job
     *
     * @param key
     * @return
     */
    @SuppressWarnings("rawtypes")
    public ScheduledFuture getJob(String key) {
        return futuresMap.get(key);
    }

    /**
     * 添加定时任务，如果任务名重复则抛出异常
     *
     * @param task    任务
     * @param trigger 定时器
     * @param key     任务名
     */
    @SuppressWarnings("rawtypes")
    public void addTask(Runnable task, Trigger trigger, String key) throws Exception {
        ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(task, trigger);
        ScheduledFuture oldScheduledFuture = futuresMap.put(key, future);
        if (oldScheduledFuture != null) {
            throw new Exception("添加任务key名： " + key + "重复");
        }
    }

    /**
     * 移除定时任务
     *
     * @param key 任务名
     * @return
     */
    @SuppressWarnings("rawtypes")
    public void removeTask(String key) {
        ScheduledFuture futurJob = futuresMap.remove(key);
        if (futurJob != null) {
            futurJob.cancel(true);
        }
    }

    /**
     * 更新定时任务 有可能会出现：1、旧的任务不存在，此时直接添加新任务； 2、旧的任务存在，先删除旧的任务，再添加新的任务
     *
     * @param task    任务
     * @param trigger 定时器
     * @param key     任务名称
     * @return
     */
    @SuppressWarnings("rawtypes")
    public void updateTask(Runnable task, Trigger trigger, String key) throws Exception {
        ScheduledFuture toBeRemovedFuture = futuresMap.remove(key);
        // 存在则删除旧的任务
        if (toBeRemovedFuture != null) {
            toBeRemovedFuture.cancel(true);
        }
        addTask(task, trigger, key);
    }


}
